package com.wmx.jmds.config;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

/**
 * Springboot + JdbcTemplate 多数据源配置
 * 1、自定义 {@link DataSource}
 * 2、自定义 {@link JdbcTemplate}
 *
 * @author wangMaoXiong
 * @version 1.0
 * @date 2022/2/23 17:06
 */
@Configuration
public class DataSourceConfig {

    /**
     * 默认数据源
     * bean：name 属性用于指定实例的名称，同时添加到 Spring 容器中。不指定名称时，默认是与方法名称相同。
     * Primary：当使用 @Resource、@Autowired 注入时，如果出现多个相同类型，则选择 primary 标记的类型优先注入。
     * ConfigurationProperties：为实例注入全局配置文件中指定前缀下的配置信息
     *
     * @return
     */
    @Bean
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.default")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    /**
     * workflow 数据源
     *
     * @return
     */
    @Bean(name = "workflowDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.workflow")
    public DataSource workflowDataSource() {
        return DataSourceBuilder.create().build();
    }

    /**
     * element 数据源
     *
     * @return
     */
    @Bean(name = "elementDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.element")
    public DataSource elementDataSource() {
        return DataSourceBuilder.create().build();
    }

    /**
     * 使用自定义的数据源重新创建 JdbcTemplate 实例，参数 DataSource 此时默认取的是上面 Primary 标记的实例
     *
     * @param dataSource
     * @return
     */
    @Bean(name = "jdbcTemplate")
    public JdbcTemplate defaultJdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    /**
     * 使用自定义的数据源重新创建 JdbcTemplate 实例，使用 Qualifier 获取指定名称的 DataSource 实例
     *
     * @param dataSource
     * @return
     */
    @Bean(name = "workflowJdbcTemplate")
    public JdbcTemplate workflowJdbcTemplate(@Qualifier("workflowDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    /**
     * 使用自定义的数据源重新创建 JdbcTemplate 实例，使用 Qualifier 获取指定名称的 DataSource 实例
     *
     * @param dataSource
     * @return
     */
    @Bean(name = "elementJdbcTemplate")
    public JdbcTemplate elementJdbcTemplate(@Qualifier("elementDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

}
